﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
using System.Web.Script.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.IO;
using System.Text;
using System.Text.RegularExpressions; 

/// <summary>
///JsonParse 的摘要说明
/// </summary>
public static class JsonParse
{

    public static List<T> JSONStringToList<T>(this string JsonStr)
    {
        JavaScriptSerializer Serializer = new JavaScriptSerializer();
        List<T> objs = Serializer.Deserialize<List<T>>(JsonStr);
        return objs;
    }
    //public static T Deserialize<T>(string json)
    //{
    //    T obj = Activator.CreateInstance<T>();
    //    using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(json)))
    //    {
    //        DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    //        return (T)serializer.ReadObject(ms);
    //    }
    //}
 
     /// <summary>  
    /// JSON序列化  
    /// </summary>  
     public static string Serializer<T>(T t)
    {
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
        MemoryStream ms = new MemoryStream();
        ser.WriteObject(ms, t);
        string jsonString = Encoding.UTF8.GetString(ms.ToArray());
        ms.Close();
        //替换Json的Date字符串    
        string p = @"\\/Date\((\d+)\+\d+\)\\/";
        MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertJsonDataToDateString);
        Regex reg = new Regex(p);
        jsonString = reg.Replace(jsonString, matchEvaluator);
        return jsonString;
     }  
     /// <summary>  
     /// JSON反序列化  
     /// </summary>  
     public static T Deserialize<T>(string jsonString)
     {
         //将"yyyy-MM-dd HH:mm:ss"格式的字符串转为"//Date(1294499956278+0800)//"格式    
         string p = @"\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}";
         MatchEvaluator matchEvaluator = new MatchEvaluator(ConvertDateStringToJsonDate);
         Regex reg = new Regex(p);
         jsonString = reg.Replace(jsonString, matchEvaluator);
         DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
         MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
         T obj = (T)ser.ReadObject(ms);
         return obj;
     }

     /// <summary>
     /// Converts the json data to date string.
     /// </summary>
     ///<param name="m">The m.
     /// <returns>System.String.</returns>
     /// <remarks>Editor：v-liuhch CreateTime：2015/6/22 11:39:18</remarks>
     private static string ConvertJsonDataToDateString(Match m)
     {
         string result = string.Empty;
         DateTime dt = new DateTime(1970, 1, 1);
         dt = dt.AddMilliseconds(long.Parse(m.Groups[1].Value));
         dt = dt.ToLocalTime();//转换为本地时间
         result = dt.ToString("yyyy-MM-dd HH:mm:ss");
         return result;

     }
     /// <summary>
     /// Converts the date string to json date.
     /// </summary>
     ///<param name="m">The m.
     /// <returns>System.String.</returns>
     /// <remarks>Editor：v-liuhch CreateTime：2015/6/22 11:39:15</remarks>
     private static string ConvertDateStringToJsonDate(Match m)
     {
         string result = string.Empty;

         DateTime dt = DateTime.Parse(m.Groups[0].Value);

         dt = dt.ToUniversalTime();

         TimeSpan ts = dt - DateTime.Parse("1970-01-01");

         result = string.Format("\\/Date({0}+0800)\\/", ts.TotalMilliseconds);

         return result;
     }
}  
